perm filename BEAMZ.F4[MSS,LCS]1 blob sn#134981 filedate 1974-12-05 generic text, type T, neo UTF8
00100	C***** BEAMS,  MARKS,  XNOTE, BAUTO, UPDATE *******
00200		SUBROUTINE BEAMS
00300		COMMON/XRN/RN(2000),IT,POS,RA,NN,JB,RB,A,B,JMP,JK,C,DMAX,
00325		1 UMAX,AA,JMAX,X,Y,BB,RNX(1982)
00362		1 /FRMT/F78F(1),FA1(1),FA5(1),IREAD /ALF/INP(72),ML
00380		1 /PTR/PWDS(250),ITEM,LL,IS,IX
00400		COMMON/SCM/V(78),I,LCNT,STAFF,LIST(200),REND
00410		COMMON RJB,JAZ,CENTR,JBZ,RJQ(20),JQ(20)
00500		COMMON/SCX/RHY(4),JALPHA(19),JX,U,JZ,IRHY,JD,KA,KB,IZ
00600		1 /SC/J,L,MK,ISKP,XMINUS,N,IEXP,LK,NNUM,JJ,JA,DBST,NFLG
00700		1 ,IXX,ISEMI,IQT,VX(50),IAMP,K,KN,M,MODE,IBLA
00800		1 /STF/RSTFAC(8),RSTJC
00900		DIMENSION R(10,80)
01100		EQUIVALENCE (R,RN(3001)),(STEM,RN(2999))
01200		DATA BX/25./,BY/.5/,DFAC/4./
01300	
01310		INVT=-1
01332		IF(MODE.EQ.3)GO TO 25
01420		IF(REND.NE.0)GO TO 25
01425		REND=3
01500	25	DO 1500 K=1,72
01600		IF(INP(K).EQ.'B')GO TO 22
01700	C  B=AUTOMATIC BEAMS.
01800		IF(INP(K).NE.'*')GO TO 1500
01900	15	INP(72)='*'
02000		GO TO 500
02100	1500	IF(INP(K).EQ.ISEMI)GO TO 500
02110		GO TO 15
02200	C ABOVE FOR 2ND LNE OF INPUT. IF LNS ENDS WITHOUT * OR ;, IT PUTS IN *
02300	22	REREAD F78F,A,B
02400	C  TYPE '2B' OR '3B' FOR AUTOMATIC BEAMS. (2=DUPLE  3=TRIPLE)
02500		IF(IREAD.NE.0)A=B
02600		A=A/2.
02700	C  '2'=1  '3'=1.5
02850		IF(STEM)STEM=0
02875	C STEM=10 OR 20 IF ALREADY SETUP IN NOTES
02900		K=0
03000		N=0
03100		J=0
03200		INP(72)='*'
03230	C  PICKS UP RHYTHM FROM TIME WHEN MODE=2 (NOW IT =4)
03300	122	K=K+1
03400		L=K
03500	222	C=ABS(V(K))
03600		IF(V(K).GT.0)GO TO 922
03700	1022	N=N+1
03800	C  SUBTRACTS NUMB. FOR REST.
03900		IF(C.GE.A)GO TO 1222
04000	1322	L=L+1
04100		GO TO 422
04200	1222	IF(AMOD(C,A).NE.0)GO TO 622
04300		IF(K-L.LE.1)GO TO 522
04400		L=L+1
04500		GO TO 722
04600	922	IF(C.EQ.A)GO TO 522
04700	422	IF(K.EQ.IRHY)GO TO 322
04800		K=K+1
04900		C=C+ABS(V(K))
05000		IF(V(K))GO TO 1022
05100		IF(C.LT.A-.0001)GO TO 422
05175		IF(C.LT.A+.0001)GO TO 722
05250	C  .0001 FOR ROUNDOFF PROBLEMS
05325	1922	C=AMOD(C,A)
05400		IF(K-L.LE.1)GO TO 622
05475		CALL BAUTO(J,L,K-1,N)
05625	622	L=K
05700		IF(ABS(V(K)).GE.A.OR.C.EQ.0)L=L+1
05800		GO TO 422
05900	722	IF(K.EQ.L)GO TO 522
06000	1722	DO 1422 IT=L,K
06100	1422	IF(V(IT).GE.1)GO TO 1522
06200	C WON'T PUT BEAMS WHERE NOT LOGICAL.
06210		IF(V(L)+V(K).LT.A+.0001)CALL BAUTO(J,L,K,N)
06255	C  DOES ONLY DUPLES AT THIS POINT.
06400	522	IF(K.LT.IRHY)GO TO 122
06500	
06600	322	IF(J.EQ.0)RETURN
06700	C  NO BEAMS - SO GO BACK.
06800		DO 822 K=J+1,68
06850	C  USES ONLY 68 SLOTS IN 'V'
06900	822	V(K)=0
07000		J=0
07100		GO TO 27
07200	1522	IF(IT-1.GT.L)GO TO 1622
07300	1822	L=IT+1
07400		IF(L.LT.K)GO TO 1722
07500		GO TO 522
07600	1622	CALL BAUTO(J,L,IT-1,N)
07700		GO TO 1822
07800	C  ALL THIS ↑↑ FOR QUARTERS IN TRIPLE TIME UNITS!
07820	27	DO 26 L=1,50
07860	26	VX(L)=V(L)
07870	C  BECAUSE MODE 3 IS NOW ACCENTS, ETC.
07880		GO TO 511
07900	
08000	500	REREAD F78F,VX
08100		J=0
08200		IF(IREAD.NE.0)J=1
08300	511	J=J+1
08400		N=VX(J)
08500	C  SKIPS LINE #S.
08600		JMP=1
08700	505	L=0
08800		K=0
08900		POS=-10.
09000		IF(MODE.EQ.3)GO TO 5030
09100	C  MODE 3 IS FOR ACCENTS ETC.
09200		IF(N.GT.100)GO TO 161
09300	C  IZ=TOTAL # OF NOTES
09500		RN(8+IS)=0
09600		IT=0
09700	503	IF(N.GT.0)GO TO 5031
09800		IT=-1
09900		POS=-1.3
10000	C  -1= SLUR INTO 1ST NOTE.
10200	C  SETS POS OF LFT SIDE (-10+9, THEN +2)
10300		GO TO 5060
10400	5031	IF(N.LE.80)GO TO 5030
10500	C  203 WILL BECOME 201 AT 61
10600		POS=202
10700		GO TO 550
10800	C  -1=1ST SLUR FROM NO NOTE; 99= LAST, TO NO NOTE
10900	5030	L=L+1
11000	502	K=K+1
11100		IF(R(1,K).NE.1.)GO TO 502
11200	C  IS IT A NOTE?
11300		P=R(2,K)
11400		IF(P.EQ.POS)GO TO 502
11500	C  SKIPS DBLSTPS
11600		POS=P
11700	506	IF(L.NE.N)GO TO 5030
11800	5060	IF(MODE.EQ.3)GO TO 30
11900	C  NOW SLUR STARTS
12000		IF(JMP)GO TO 504
12100	C  JMP=-1 MEANS END NOTE OF GROUP
12200		J=J+1
12300		NN=VX(J)
12310	CC	IF(MODE.NE.5.OR.STEM)GO TO 5061
12320	CC	M=R(5,K)-20.
12330	CC	IF((NN.AND.M.GE.0).OR.(M.AND.NN.GE.0))NN=-NN
12335		IF(STEM.OR.(MODE.EQ.4.AND.STEM.EQ.0))GO TO 5061
12340	C  AUTOMATIC DIP DIRECTION FOR SLURS WITH AUTO. BEAMS.
12350		A=19.-R(5,K)
12360		IF((NN.AND.A.GT.0).OR.(A.AND.NN.GT.0))NN=-NN
12400	5061	MK=N
12500		N=NN
12600		IF(N)N=-N
12700		M=K
12800		JA=2
12900		JB=4
13000		KN=K
13200		RB=0
13300		IF(MODE.EQ.4)GO TO 550
13310		IF(STEM.GE.0)NN=-NN
13320		IF(IT)GO TO 550
13360	C  IT=-1=SLUR INTO 1ST NOTE.
13400		A=XNOTE(K)
13500	C XNOTE IS AMOD(R(4,K),100.)
13600	C  SAVES LEVEL OF 1ST NOTE.
13700	504	RB=2
13800		B=AMOD(R(6,K),1.0)
13900		IF(B.GE.0.5)RB=4.
14000		IF(B.EQ.0.4)RB=6.
14100	C   THESE ARE FOR >(.5) AND ∧(.4) ACCENTS
14200		IF(NN)RB=-RB
14300	C  DIP IS SET BY PARAM 7. (STEM DIR. IS AUTOMATIC)
14400	550	RN(JA+IS)=POS
14500		RN(JB+IS)=XNOTE(K)+RB
14600		JA=6
14700		JB=5
14800	C  MK=# OF 1ST NOTE, N=END NOTE NOW
14900		JMP=-JMP
15000		IF(JMP.GT.0)GO TO 1503
15100	C  GO FIND RT. SIDE OF SLUR
15200		IF(N.LE.MK)N=MK+1
15300	C  PICKS UP TYPO ERRORS
15400		JK=0
15500		IF(R(7,K).GE.10)JK=-1
15600	C  CHECKS FOR DOT AFTER 1ST NOTE -- FOR TIES.
15700		GO TO 503
15800	
15900	1503	RN(3+IS)=STAFF
16000		IF(MODE.EQ.4)GO TO 35
16100		RN(8+IS)=-1
16200		RN(1+IS)=8
16300		IF(IT)RN(4+IS)=RN(5+IS)
16400		NN=-NN
16500	C  IF NN IS NEG. NOW IT MEANS STEM DOWN.(DIP IS UP!)
16600		IF(MK.EQ.IRHY.OR.N.EQ.1)GO TO 61
16700		IF(((XNOTE(K).NE.A.OR.N-MK.GT.1).AND.IT.GE.0.
16800		1 ).OR.IT)GO TO 60
16900	C  .N. WAS .KQ. 12/73
17000	C  JUMP IF NOT ADJACENT NOTE AT SAME PITCH AND NOT 1ST OR LAST.
17100	61	C=9
17200		IF(JK)C=12
17300		IF(RN(6+IS)-RN(2+IS)-C*RSTJC)GO TO 65
17400		IF(IT)A=XNOTE(K)
17500		A=A+.7
17600		IF(NN.GT.0)A=A-1.4
17700	C  TO RAISE OR LOWER IT .5
17800		RN(4+IS)=A
17900		RN(5+IS)=A
18000		B=-2
18100		IF(JK)B=-3
18200	C  JK=-1 WHEN NOTE IS DOTTED.
18300	C THIS PUTS TIE BETWEEN (NOT ABOVE OR BELOW) NTS. NO STEM CHNG.
18400		RN(8+IS)=B
18500		GO TO 65
18600	161	J=J+1
18700		K=VX(J)
18800		M=N-100
18900	C  THIS WILL DIRECT STEMS ON NOTES M THROUGH K. IF -K,STEMS DN.
19000		NN=K
19100		IF(K)K=-K
19200	
19300	C  NEXT IS STEM INVERTER
19400	60	JB=1
19500		RB=10.
19600		IF(NN)GO TO 509
19700	C  IF NN IS NEG. NOW IT MEANS STEM DOWN.(DIP IS UP!)
19800		RB=-RB
19900		JB=2
20000	509	DO 507 L=M,K
20100		IF(R(1,L).NE.1.)GO TO 507
20200		JA=R(5,L)/10.
20400		IF(JA.NE.JB)GO TO 507
20405		R(5,L)=R(5,L)+RB
20410		INVT=0
20450	C**********************************************
20500	507	CONTINUE
20600		IF(N.GT.100)GO TO 514
20700	C  JUMP IF ONLY REVERSING STEMS.
20800		GO TO 200
20900	62	IF(NN)GO TO 64
21000		IF(A.EQ.DMAX)GO TO 65
21100		AA=B-DMAX
21200		GO TO 63
21300	65	AA=0
21400		GO TO 63
21500	64	IF(A.EQ.UMAX)GO TO 65
21600		AA=UMAX-B
21700	63	RA=RN(6+IS)
21800		RB=RN(2+IS)
21900		X=1.5+(RA-RB)/BX
22000		IF(AA.GT.0)X=X+AA*BY
22100		IF(NN.GT.0)X=-X
22200	510	RN(7+IS)=X
22220		IF(MODE.NE.4)GO TO 2514
22240		RN(9+IS)=0
22260		RN(10+IS)=0
22280		RN(IS+11)=-1
22290		CALL UPDATE(9)
22300		IF(JB)CALL BMX(RA)
22350		GO TO 514
22360	2514	CALL UPDATE(6)
22400	514	J=J+1
22500		N=VX(J)
22550		IF(N.GT.IRHY)N=0
22600		IF(N.NE.0)GO TO 505
22700		IF(J.LT.50)GO TO 514
22800	C  SOMETIMES A SLASH IS SEEN AS A 0 (WHEN PRECEDED BY SPACE).
22900		IF(INP(72).NE.'*')GO TO  552
22905		IF(INVT)RETURN
22915		INVT=IS
22920		CALL NEWR
22925		IS=INVT
22990		RETURN
23000	552	IF(IREAD.NE.0)GO TO 3501
23100		CALL TYPE
23200		GO TO 25
23300	3501	READ(22,2501)J,INP
23380	C  TO READ MORE THAN 2 LINES.
23400		GO TO 25
23500	C  FOR 2ND LINE.
23600	2501	FORMAT(I,72A1)
23700	
23800	
24000	35	RA=10.
24100	C  RA WILL=# OF TAILS,  KN=1ST NOTE, K=LAST ('MOD' FOR DOTTED NOTES.)
24200		RN(1+IS)=9
24300		JMAX=0
24400		IF(N-MK.EQ.1)JMAX=-1
24500		DMAX=100.
24600		UMAX=-DMAX
24700	C  FOR AUTO. BEAMS
24800	
24900		JB=0
25000		DO 2 L=KN,K
25400	12	IF(R(1,L).NE.1.OR.R(5,L).LT.10.)GO TO 2
25500	C  SKIPS NON-NOTES AND DBLSTPS
25600		RB=R(4,L)
25700		IF(ABS(RB).GE.100)GO TO 2
25800	C  SKIPS GRACE NOTES
25900		IF(RB.GT.UMAX)UMAX=RB
26000		IF(RB.LT.DMAX)DMAX=RB
26100	C  FOR AUTO. BEAMS
26200		RB=AMOD(R(7,L),10.0)
26300	112	IF(RA.EQ.RB)GO TO 2
26400		JB=-1
26500	C   FLAG FOR MIXED NUM. OF BEAMS
26600		IF(RB.LT.RA.AND.RB.NE.0)RA=RB
26700	2	CONTINUE
26800	C  ABOVE FINDS SMALLEST # OF TAILS.  NEXT FOR HGTS.
26900	C  ABOVE IS POS.2
27075		IF(STEM.EQ.0.AND.UMAX+DMAX.GE.14)NN=-1
27087	CXX	IF(STEM.GT.0)NN=10.-STEM
27100	C  SETS AUTO. BEAMS' STEM DIRECTION.
27200		X=10
27300		IF(NN)X=20
27400		X=X+RA
27500	C  # OF BEAMS.  IT'S PUT IN  DOWN BELOW 550.
27600	200	A=XNOTE(KN)
27700	C   A=NOTE 1.
27800		UMAX=A
27900		DMAX=A
28000	C  UP MAX. NOTE #, DOWN MAX. NOTE #.
28100	103	DO 3 M=KN,K
28200		IF(R(1,M).NE.1.OR.ABS(R(4,M)).GE.100)GO TO 3
28300	C  SKIPS NON-NOTES
28400	7	Y=R(5,M)
28500		B=XNOTE(M)
28550		IF(STEM.GT.0)GO TO 55
28600	33	IF(NN.GT.0.)GO TO 5
28700	C  JUMP IF STEM UP
28800		IF(Y.GE.20..OR.Y.LT.10.)GO TO 55
28850		R(5,M)=Y+10.
28875		GO TO  551
29000	5	IF(Y.LT.20.)GO TO 55
29025		R(5,M)=Y-10.
29050	C************************
29100	C    STEM UP
29120	551	INVT=0
29200	55	IF(B.LT.UMAX)GO TO 13
29300		UMAX=B
29400		IF(JMAX.OR.M.EQ.KN.OR.M.EQ.K)GO TO 3
29500		UMAX=UMAX+1
29600		GO TO 3
29700	13	IF(B.GT.DMAX)GO TO 3
29800		DMAX=B
29900		IF(JMAX.OR.M.EQ.KN.OR.M.EQ.K)GO TO 3
30000		DMAX=DMAX-1
30100	3	CONTINUE
30200	C  LOOKS FOR LOWER AND HIGHER NOTES THAN NOTE 1.
30300	4	IF(MODE.EQ.5)GO TO 62
30400		AA=A
30500		BB=B
30600		C=1
30700		IF(X.LT.20.)GO TO 48
30800	C  JUMP IF STEM IS UP
30900		CALL EXCH(AA,BB)
31000		C=-C
31100		CALL EXCH(UMAX,DMAX)
31200	48	IF(AA.LT.BB)GO TO 45
31300		IF(UMAX.EQ.A)GO TO 46
31400	47	A=UMAX-C
31500		B=A
31600		GO TO 444
31700	46	IF(UMAX.GT.AA)GO TO 47
31800		GO TO 49
31900	45	IF(UMAX.NE.B)GO TO 47
32000	49	A=AA
32100		B=BB
32200		IF(X.GE.20)CALL EXCH(A,B)
32300	
32400	444	RN(3+IS)=STAFF 
32420	446	DIS=(RN(IS+6)-RN(IS+2))/DFAC
32460	C  FOR TILT LATER -- DFAC IS IN DATA
32560		IF(ABS(A-B).LT.DIS)GO TO 14
32570		C=C*DIS
32580	C  NEW TILT ROUTINE.  CONSIDERS DISTANCE:HEIGHT
32600	C  LIMITS SLOPE OF BEAM
32700		IF(X.GE.20)GO TO 141
32800		IF(B.GT.A)GO TO 140
32900	142	B=A-C
33000		GO TO 14
33100	141	IF(B.GT.A)GO TO 142
33200	140	A=B-C
33300	14	RN(4+IS)=A
33400		RN(5+IS)=B
33500	C   MAKES HORIZONTAL BEAMS IF PATTERN IS UP-DOWN.
33600		RN(6+IS)=R(2,K)
33700	C  ABOVE IS POS.2
33800		GO TO 510
33900	
34000	C   NEXT IS FOR ACCENTS AND OTHER MARKS
34100	
34200	30	CALL MARKS(RA)
34300		J=J+1
34400		IF(RA.EQ.99)RA=VX(J)
34500	C  IF STEM IS DOWN OR THERE ARE NOTES BELOW(DBL STP), POSITION
34600	C    OF ACCENT WILL BE INVERTED.
34700		RB=R(6,K)
34800		B=10.
34900		IF(RA.EQ.6)RA=26.
35000	C TEMPORARY CHANGE FOR FERMATA*******
35100		IF(RA.GT.10.)RA=RA/10.
35200		A=ABS(AMOD(RB,1.))
35300		IF(A.EQ.0)GO TO 301
35400		IF(RA.GT.3)GO TO 303
35500		RB=FLOAT(IFIX(RB))
35600		RA=RA+A/10.
35700	C  THIS PUTS 2-DIGIT CODE BEFORE 1-DIGIT CODE.
35800		GO TO 301
35900	303	IF(A.LT..3)GO TO 302
36000		B=100.
36100		GO TO 301
36200	302	B=1000.
36300	301	IF(RB.LT.0)RA=-RA
36400		R(6,K)=RB+RA/B
36500		GO TO 514
36600	C   USES 4-7,9,11-13 FOR ACC. > FERM. DOT - DNBOW UPBOW HARM.
36700	C  NOTE#,ACCENT#/N,A/N,A*
36800		END
36900	
37000		FUNCTION XNOTE(J)
37100		COMMON/XRN/RN(4000)
37200		DIMENSION R(10,80)
37300		EQUIVALENCE (R,RN(3001))
37400		XNOTE=AMOD(R(4,J),100.)
37500		END
37600	
37700		SUBROUTINE BAUTO(J,L,K,N)
37800	C  FOR AUTOMATIC BEAMS.
37900		COMMON/SCM/V(78),I,LCNT,STAFF,LIST(200),REND
38000		J=J+2
38100		V(J-1)=L-N
38200		V(J)=K-N
38300		END
38400	
38500		SUBROUTINE UPDATE(I)
38600		COMMON /PTR/PWDS(250),ITEM,LL,IS,IX /XRN/RN(4000)
38700		RN(IS)=I
38800		IS=IS+I+3
39100		END